Enteros de Gauss

En este bloc mostramos los comandos básicos para trabajar con aritmética entera modular.

Antes de empezar vamos a cambiar la forma en la que se representan los complejos en GAP. GAP utiliza E(4) para referirse a \(i\) (raíz cuarta de la unidad, de ahí la notación).

InstallMethod(ViewString, [IsCyc], function(n) 
    local a,b;
    a:=RealPart(n);
    b:=ImaginaryPart(n);
    if a=0 then 
        if b=1 then 
            return "i";
        fi;
        return Concatenation(String(b)," i");
    fi;
    if b=0 then 
        return String(a);
    fi;
    if b<0 then
        return Concatenation(String(a)," - ",String(-b)," i");
    elif b=1 then
        return Concatenation(String(a)," + i");
    else
        return Concatenation(String(a)," + ",String(b)," i");
    fi;
    end
    );
i:=E(4);
i

Cociente y resto

Dados dos enteros de Gauss \(a\) y \(b\), el cociente y el resto se pueden obtener con EuclideanQuotient y EuclideanRemainder.

EuclideanQuotient(3+i,1-2*i);
i
EuclideanRemainder(3+i,1-2*i);
1
(-3+i)/(1+i);
-1 + 2 i

En cualquier dominio euclídeo también se puede utilizar QuotientRemainder.

QuotientRemainder(GaussianIntegers,3+E(4),1-2*E(4));
[ i, 1 ]

Podemos usar Int para obtener la parte “entera” de un cociente.

Int((27-23*E(4))/(8+E(4)));
2 - 3 i

Pero hay que tener en cuenta que éste no tiene por qué ser el cociente de la división. Vemoas qué norma tiene el resto.

N:=x->x*ComplexConjugate(x);
function( x ) ... end
a:=27-23*i;
b:=8+i;
r:=a-Int(a/b)*b;
27 - 23 i
8 + i
8 - 1 i
N(b);
65
N(r);
65

Máximo común divisor y mínimo común múltiplo. Coeficientes de Bézout

El máximo común divisor de dos enteros de Guass (o más) puede ser calculado con el comando Gcd, y su mínimo común múltiplo con el comando Lcm, tal y como lo hacíamos con enteros racionales.

Gcd(3+i,-5-2*i);
1
Lcm(3+i,-15-3*i);
9 + 33 i

Si queremos conseguir los coeficientes de Bézout, podemos usar el comando GcdRepresentation (entre las muchas posibilidades que da gap para esto).

l:=GcdRepresentation(3+i,-5-2*i);
[ 2, 1 ]

Comprobemos el resultado

l*[3+i,-5-2*i];
1
GcdRepresentation(10-5*i,15+10*i,18-5*i);
[ 5 - 25 i, 14 + 8 i, -3 ]

Ecuaciones lineales

Como ya sabemos, una vez resuelto el problema de encontrar los coeficientes de Bézout de un máximo común divisor de dos enteros de Gauss, tenemos también solución para resolver una ecuación lineal en dos variables. Lo único que tenemos que comprobar es si el término independiente es divisible por el máximo común divisor de los coeficientes, y luego multiplicar los coeficientes de Bézout por el factor apropiado para conseguir una solución particular.

Si queremos resolver \(4 x+ (3+3i) y= -1+5i\), hacemos lo siguiente.

(-1+5*i)/Gcd(4,3+3*i);
2 + 3 i

Luego una solución se obtiene fácilmente usando los coeficientes de Bézout.

s:=GcdRepresentation(4,3+3*i)*(-1+5*i)/Gcd(4,3+3*i);;

Podemos ver que el resultado es el correcto.

s*[4,3+3*i];
-1 + 5 i

Factorizaciones y primos

Para factorizar un entero en producto de primos podemos usar el comando Factors.

Factors(20+18*i);
[ 1 - 1 i, 1 + i, 10 + 9 i ]

También podemos saber si un número es primo usando el comando IsPrime. Pero tenemos que tener cuidado con especificar el anillo en que queremos comprobar la primalidad cuando se trate de enteros.

IsPrime(5);
true
IsPrime(GaussianIntegers,5);
false

Congruencias

Para resolver una ecuación en recurrencias podemos usar GcdRepresentation como hicimos arriba con una ecuación lineal.

Si lo que queremos es resolver un sistema de congruencias de la forma \[ \begin{array}{l} x\equiv a_1\bmod m_1,\\ \dots\\ x\equiv a_n\bmod m_n, \end{array} \] en el caso de enteros de Gauss lo podemos hacer resolviendo una a una las ecuaciones y poniendo en la siguiente la solución para determinar el valor del parámetro. Así, para resolver \[ \begin{array}{l} x\equiv i\bmod 3,\\ x\equiv 1+i \bmod 5+2i, \end{array} \] hacemos lo siguiente.

De la primera ecuación deducimos que \(x=i+3t\) para algún \(t\in \mathbb{Z}[i]\).

Sustituimos en la segunda y obtenemos \(i+3t\equiv 1+i \bmod{5+2i}\). Por lo que tenemos que resolver \(3t\equiv 1\bmod{5+2i}\).

Gcd(3,5+2*i);
1
GcdRepresentation(3,5+2*i);
[ -2 + i, 1 - 1 i ]

Esto nos dice que el inverso de \(3\) módulo \(5+2i\) es \(-2+i\). Así, nos queda \(t\equiv -2+i \bmod{5+2i}\), o lo que es lo mismo, \(t=-2+i+(5+2i)s\) para algún \(s\in \mathbb{Z}[i]\). Por tanto, \(x=i+3(-2+i+(5+2i)s)=-6+4i+(15+6i)s\) con \(s\in\mathbb{Z}[i]\)

Comprobemos que la solución particular \(-6+4i\) está bien.

EuclideanRemainder(-6+4*i-i,3);
0
EuclideanRemainder(-6+4*i-(1+i),5+2*i);
0